home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / misc / icom_cat / control.bas next >
Encoding:
BASIC Source File  |  1993-08-07  |  18.3 KB  |  778 lines

  1. DECLARE SUB MenuAnnounce ()
  2. DECLARE SUB MenuAntenna ()
  3. DECLARE SUB MenuAttenuator ()
  4. DECLARE SUB MenuTuning ()
  5. DEFINT G-Z
  6.  
  7. '
  8. ' Configuration Information
  9. '
  10. CONST RA = &H3C                 ' Receive Address (IC-737)
  11. CONST TA = &HE0                 ' Transmit Address (Computer)
  12. CONST FREQCNT = 5               ' Number of bytes in frequency (IC-737 uses 5)
  13.  
  14. CONST PORT$ = "COM1"            ' Serial Port to use
  15. CONST PORTNO = 1                ' Serial Port to use
  16. CONST CONF$ = "1200,N,8,1"      ' Baud rate, Parity, Bits, Stop Bits
  17.  
  18. CONST SHOWCOM = 1               ' Show Com Packets ( 0=No, 1=Yes)
  19.  
  20. '
  21. '  Declarations
  22. '
  23. DECLARE FUNCTION BCDtoINT& (BcdString AS STRING, Numbytes AS INTEGER)
  24. DECLARE SUB DoCommand (Cmd AS INTEGER, Arg AS STRING)
  25. DECLARE FUNCTION GetChan$ ()
  26. DECLARE FUNCTION GetOff$ ()
  27. DECLARE FUNCTION GetFreq$ (ByteCnt AS INTEGER)
  28. DECLARE FUNCTION GetMenu (x AS INTEGER, y0 AS INTEGER, y1 AS INTEGER)
  29. DECLARE SUB MenuInfo ()
  30. DECLARE SUB MenuMisc ()
  31. DECLARE SUB MenuMem ()
  32. DECLARE SUB MenuMode ()
  33. DECLARE SUB MenuScan ()
  34. DECLARE SUB MenuVFO ()
  35. DECLARE SUB ParseEcho (Echo AS STRING)
  36. DECLARE SUB ParseReply ()
  37. DECLARE SUB ParseRig (rig AS STRING)
  38. DECLARE SUB ParseTranceive (Tranceive AS STRING)
  39. DECLARE SUB SetupBCD ()
  40. DECLARE SUB SetupCOM ()
  41. DECLARE SUB ShowFreq (Args AS STRING)
  42. DECLARE SUB ShowLimit (Args AS STRING)
  43. DECLARE SUB ShowMainPrompts ()
  44. DECLARE SUB ShowMode (Args AS STRING)
  45. DECLARE SUB ShowOffset (Args AS STRING)
  46. DECLARE SUB ShowPrompt ()
  47. DECLARE FUNCTION STRtoHEX$ (Str AS STRING)
  48.  
  49. DIM SHARED BCD$(100)
  50.  
  51. '
  52. ' Initialize
  53. '
  54. SetupBCD
  55. SetupCOM
  56. ShowMainPrompts
  57.  
  58. '
  59. '  Endless loop until an event handler kills us
  60. '
  61. DO UNTIL TRUE
  62. LOOP
  63.  
  64. '
  65. ' Event Handlers
  66. '
  67. Serial: ParseReply:                 RETURN
  68. F1: MenuInfo:                       RETURN
  69. F2: MenuVFO:                        RETURN
  70. F3: MenuMem:                        RETURN
  71. F4: MenuMode:                       RETURN
  72. F5: DoCommand 5, GetFreq$(FREQCNT): RETURN
  73. F6: DoCommand &HD, GetOff$:         RETURN
  74. F7: MenuScan:                       RETURN
  75. F8: MenuMisc:                       RETURN
  76. F0: CLOSE : SYSTEM
  77. DEFDBL F
  78.  
  79.  
  80. '
  81. ' Echo replys to the screen if we were told to
  82. '
  83.  
  84. DEFSNG F
  85. '
  86. ' BCDtoINT&  Convert a BCD string to an Long Integer.
  87. '
  88. FUNCTION BCDtoINT& (BcdString AS STRING, Numbytes AS INTEGER)
  89.  
  90.   DA$ = ""
  91.  
  92.   FOR i% = 1 TO Numbytes
  93.     DA$ = RIGHT$("00" + HEX$(ASC(MID$(BcdString, i%, 1))), 2) + DA$
  94.   NEXT i%
  95.  
  96.   BCDtoINT& = VAL(DA$)
  97. END FUNCTION
  98.  
  99. ' +---------------------------------------------------------------------+
  100. ' |                                                                     |
  101. ' |                      ICOM CI-V Packet Layout                        |
  102. ' |     +----------+----------+---------+---------+---------+------+    |
  103. ' |     | Preamble | Transmit | Receive | Command | Sub     | EOM  |    |
  104. ' |     | <FE><FE> | Address  | Address |         | Command | <FD> |    |
  105. ' |     +----------+----------+---------+---------+---------+------+    |
  106. ' |                                                                     |
  107. ' |     A packet consists of two bytes of &HFE, one byte for the        |
  108. ' |     transmit address (Controller), One byte receive address         |
  109. ' |     (Rig), one byte command, one to five byte subcommand, and       |
  110. ' |     finally the tail of one byte of &HFD.                           |
  111. ' |                                                                     |
  112. ' +---------------------------------------------------------------------+
  113. SUB DoCommand (Cmd AS INTEGER, SubCmd AS STRING)
  114.  
  115.   '
  116.   ' Create the packet and send it out
  117.   '
  118.   Out$ = CHR$(&HFE) + CHR$(&HFE) + CHR$(RA) + CHR$(TA) + CHR$(Cmd) + SubCmd + CHR$(&HFD)
  119.   PRINT #1, Out$;
  120.  
  121.   '
  122.   ' If we're watching packets, send to the screen in hex
  123.   '
  124.   IF SHOWCOM THEN
  125.     VIEW PRINT 16 TO 20
  126.     CLS
  127.     LOCATE 17, 1
  128.     PRINT " Sent:"; STRtoHEX$(Out$); " "
  129.     PRINT " Echo:"
  130.     PRINT " Back:"
  131.     PRINT "Track:"
  132.   END IF
  133. END SUB
  134.  
  135. '
  136. ' Get a memory channel from the user
  137. '
  138. FUNCTION GetChan$
  139.   i = 0
  140.   WHILE i = 0
  141.     VIEW PRINT 6 TO 20
  142.     CLS
  143.     LOCATE 12, 30: INPUT "Enter Memory Channel: ", i
  144.     IF i < 1 OR i > 9999 THEN i = 0
  145.   WEND
  146.  
  147.   IF i < 100 THEN
  148.     GetChan$ = BCD$(i)
  149.   ELSE
  150.     i$ = RIGHT$("0000" + MID$(STR$(i), 2), 4)
  151.     DA$ = ""
  152.  
  153.     FOR K = 1 TO 4 STEP 2
  154.       DA$ = DA$ + BCD$(VAL(MID$(i$, K, 2)))
  155.     NEXT K
  156.     GetChan$ = DA$
  157.   END IF
  158.   CLS
  159. END FUNCTION
  160.  
  161. DEFDBL F
  162. '
  163. '  Get a Frequency and convert to BCD then return it
  164. '
  165. FUNCTION GetFreq$ (ByteCnt AS INTEGER)
  166.   
  167.   VIEW PRINT 6 TO 20
  168.   f = 0!
  169.   WHILE f = 0!
  170.     CLS
  171.     LOCATE 12, 30: INPUT "Enter Frequency (MHz):"; f
  172.     f = f + 1E-12: IF f < .1 OR f > 2147.484 THEN f = 0!
  173.   WEND
  174.  
  175.   f$ = RIGHT$("0000000000" + MID$(STR$(INT(f * 1000000#)), 2), FREQCNT * 2)
  176.  
  177.   DA$ = ""
  178.  
  179.   FOR K = 1 TO (FREQCNT * 2) STEP 2
  180.     DA$ = BCD$(VAL(MID$(f$, K, 2))) + DA$
  181.   NEXT K
  182.  
  183.   CLS
  184.   ShowFreq (DA$)
  185.   GetFreq$ = DA$
  186. END FUNCTION
  187.  
  188. DEFSNG F
  189. '
  190. '
  191. '  GetMenu      - Process a Menu that is on the screen
  192. '
  193. FUNCTION GetMenu (x AS INTEGER, y0 AS INTEGER, y1 AS INTEGER)
  194.  
  195. y = y0
  196.  
  197. DO UNTIL TRUE
  198.  
  199.   LOCATE y, x: PRINT "";
  200.  
  201.   i$ = ""
  202.   WHILE i$ = ""
  203.     i$ = INKEY$
  204.   WEND
  205.  
  206.   SELECT CASE MID$(i$, 1, 1)
  207.     CASE CHR$(0):
  208.       SELECT CASE MID$(i$, 2, 1)
  209.  
  210.     CASE CHR$(72), CHR$(75):
  211.       LOCATE y, x: PRINT " ";
  212.       y = y - 1: IF y < y0 THEN y = y1
  213.       LOCATE y, x: PRINT "";
  214.  
  215.     CASE CHR$(80), CHR$(75):
  216.       LOCATE y, x: PRINT " "
  217.       y = y + 1: IF y > y1 THEN y = y0
  218.       LOCATE y, x: PRINT "";
  219.  
  220.       END SELECT
  221.  
  222.     CASE CHR$(27): GetMenu = 0: EXIT FUNCTION
  223.  
  224.     CASE CHR$(13): GetMenu = y - y0 + 1: EXIT FUNCTION
  225.  
  226.   END SELECT
  227. LOOP
  228.  
  229. END FUNCTION
  230.  
  231. DEFDBL F
  232. '
  233. '  Get an offset, convert to BCD and return it
  234. '
  235. FUNCTION GetOff$
  236.   
  237.   f = 0!
  238.   WHILE f = 0!
  239.    
  240.     VIEW PRINT 6 TO 20
  241.     CLS
  242.     LOCATE 12, 30: INPUT "Enter Offset (MHz):"; f
  243.     f = f + 1E-12: IF f < .1 OR f >= 99.9999 THEN f = 0!
  244.   WEND
  245.  
  246.   f$ = RIGHT$("0000000000" + MID$(STR$(INT(f * 10000#)), 2), 6)
  247.  
  248.   DA$ = ""
  249.  
  250.   FOR K = 1 TO 6 STEP 2
  251.     DA$ = BCD$(VAL(MID$(f$, K, 2))) + DA$
  252.   NEXT K
  253.  
  254.   CLS
  255.   GetOff$ = DA$
  256. END FUNCTION
  257.  
  258. DEFSNG F
  259. '
  260. ' MenuAnnounce  - Put up the Announce Menu and allow user input
  261. '
  262. SUB MenuAnnounce
  263.  
  264.   LOCATE 10, 65: PRINT "┌─────────┐";
  265.   LOCATE 11, 65: PRINT "│         │";
  266.   LOCATE 12, 65: PRINT "│  All    │"
  267.   LOCATE 13, 65: PRINT "│  Freq   │";
  268.   LOCATE 14, 65: PRINT "│         │";
  269.   LOCATE 15, 65: PRINT "└─────────┘"
  270.  
  271.  
  272.   i% = GetMenu(66, 12, 13)
  273.   CLS
  274.  
  275.   IF i% > 0 THEN
  276.     DoCommand &H10, CHR$(i% - 1)
  277.   END IF
  278.  
  279. END SUB
  280.  
  281. '
  282. ' MenuAntenna   - Put up the Antenna Menu and allow user input
  283. '
  284. SUB MenuAntenna
  285.  
  286.   LOCATE 10, 65: PRINT "┌─────────┐";
  287.   LOCATE 11, 65: PRINT "│         │";
  288.   LOCATE 12, 65: PRINT "│  1 (Off)│";
  289.   LOCATE 13, 65: PRINT "│  2 (On) │";
  290.   LOCATE 14, 65: PRINT "│         │";
  291.   LOCATE 15, 65: PRINT "└─────────┘"
  292.  
  293.  
  294.   i% = GetMenu(66, 12, 13)
  295.   CLS
  296.  
  297.   IF i% > 0 THEN
  298.     DoCommand &H10, CHR$(i% - 1)
  299.   END IF
  300. END SUB
  301.  
  302. '
  303. ' MenuAttenuator        - Put up the Attenuator Menu and allow user input
  304. '
  305. SUB MenuAttenuator
  306.  
  307.   LOCATE 10, 65: PRINT "┌─────────┐";
  308.   LOCATE 11, 65: PRINT "│  OFF    │";
  309.   LOCATE 12, 65: PRINT "│  10 dB  │";
  310.   LOCATE 13, 65: PRINT "│  20 dB  │";
  311.   LOCATE 14, 65: PRINT "│  30 dB  │";
  312.   LOCATE 15, 65: PRINT "└─────────┘"
  313.  
  314.  
  315.   i% = GetMenu(66, 11, 14)
  316.   CLS
  317.  
  318.   IF i% > 0 THEN
  319.     DoCommand &H10, CHR$((i% - 1) * 16)
  320.   END IF
  321. END SUB
  322.  
  323. '
  324. ' MenuInfo      - Put the Info Menu up and Get user input
  325. '
  326. SUB MenuInfo
  327.  
  328.   ShowPrompt
  329.   LOCATE 10, 45: PRINT "┌────────────────┐"
  330.   LOCATE 11, 45: PRINT "│  Frequency     │"
  331.   LOCATE 12, 45: PRINT "│  Mode          │"
  332.   LOCATE 13, 45: PRINT "│  Offset        │"
  333.   LOCATE 14, 45: PRINT "│  Limits        │"
  334.   LOCATE 15, 45: PRINT "└────────────────┘"
  335.  
  336.  
  337.   i% = GetMenu(46, 11, 14)
  338.   CLS
  339.  
  340.   SELECT CASE i%
  341.     CASE 1: DoCommand &H3, ""
  342.     CASE 2: DoCommand &H4, ""
  343.     CASE 3: DoCommand &HC, ""
  344.     CASE 4: DoCommand &H2, ""
  345.   END SELECT
  346.  
  347. END SUB
  348.  
  349. '
  350. '  MenuMem      - Put the Memory Menu up and get user input
  351. '
  352. '
  353. SUB MenuMem
  354.  
  355.   ShowPrompt
  356.   LOCATE 9, 45:  PRINT "┌────────────────┐"
  357.   LOCATE 10, 45: PRINT "│  Memory        │"
  358.   LOCATE 11, 45: PRINT "│  Select Memory │"
  359.   LOCATE 12, 45: PRINT "│  VFO  M       │"
  360.   LOCATE 13, 45: PRINT "│  M  VFO       │"
  361.   LOCATE 14, 45: PRINT "│  Memory Clear  │"
  362.   LOCATE 15, 45: PRINT "└────────────────┘"
  363.  
  364.  
  365.   i% = GetMenu(46, 10, 14)
  366.   CLS
  367.  
  368.   SELECT CASE i%
  369.     CASE 1: DoCommand &H8, ""
  370.     CASE 2: DoCommand &H8, GetChan$
  371.     CASE 3: DoCommand &H9, ""
  372.     CASE 4: DoCommand &HA, ""
  373.     CASE 5: DoCommand &HB, ""
  374.   END SELECT
  375. END SUB
  376.  
  377. '
  378. ' MenuMisc      - Put up the Misc Menu and await user input
  379. '
  380. SUB MenuMisc
  381.  
  382.   ShowPrompt
  383.   LOCATE 10, 45: PRINT "┌────────────────┐"
  384.   LOCATE 11, 45: PRINT "│  Tuning Step   │"
  385.   LOCATE 12, 45: PRINT "│  Attenuator    │"
  386.   LOCATE 13, 45: PRINT "│  Antenna       │"
  387.   LOCATE 14, 45: PRINT "│  Announcements │"
  388.   LOCATE 15, 45: PRINT "└────────────────┘"
  389.  
  390.  
  391.   i% = GetMenu(46, 11, 14)
  392.  
  393.   SELECT CASE i%
  394.     CASE 1: MenuTuning
  395.     CASE 2: MenuAttenuator
  396.     CASE 3: MenuAntenna
  397.     CASE 4: MenuAnnounce
  398.   END SELECT
  399.  
  400.  
  401. END SUB
  402.  
  403. '
  404. '  MenuMode      - Put the Mode Menu up and get user input
  405. '
  406. SUB MenuMode
  407.  
  408.   ShowPrompt
  409.   LOCATE 8, 45:  PRINT "┌────────────────┐"
  410.   LOCATE 9, 45:  PRINT "│  LSB           │"
  411.   LOCATE 10, 45: PRINT "│  USB           │"
  412.   LOCATE 11, 45: PRINT "│  AM            │"
  413.   LOCATE 12, 45: PRINT "│  CW            │"
  414.   LOCATE 13, 45: PRINT "│  CW-Narrow     │"
  415.   LOCATE 14, 45: PRINT "│  RTTY          │"
  416.   LOCATE 15, 45: PRINT "│  FM            │"
  417.   LOCATE 16, 45: PRINT "│  Wide FM       │"
  418.   LOCATE 17, 45: PRINT "└────────────────┘"
  419.  
  420.  
  421.   i% = GetMenu(46, 9, 15)
  422.   CLS
  423.  
  424.   SELECT CASE i%
  425.     CASE 1: A$ = CHR$(&H0)
  426.     CASE 2: A$ = CHR$(&H1)
  427.     CASE 3: A$ = CHR$(&H2)
  428.     CASE 4: A$ = CHR$(&H3) + CHR$(&H1)
  429.     CASE 5: A$ = CHR$(&H3) + CHR$(&H2)
  430.     CASE 5: A$ = CHR$(&H4)
  431.     CASE 6: A$ = CHR$(&H5)
  432.     CASE 7: A$ = CHR$(&H6)
  433.   END SELECT
  434.  
  435.   IF i% > 0 THEN
  436.     DoCommand 6, A$
  437.     ShowMode (A$ + CHR$(0))
  438.   END IF
  439.  
  440. END SUB
  441.  
  442. '
  443. ' MenuScan      - Put the Scan Menu up and Get user input
  444. '
  445. SUB MenuScan
  446.  
  447.   ShowPrompt
  448.   LOCATE 10, 45: PRINT "┌────────────────┐"
  449.   LOCATE 11, 45: PRINT "│  Start Scan    │"
  450.   LOCATE 12, 45: PRINT "│  Stop Scan     │"
  451.   LOCATE 13, 45: PRINT "│  Ignore Channel│"
  452.   LOCATE 14, 45: PRINT "│  Use Channel   │"
  453.   LOCATE 15, 45: PRINT "└────────────────┘"
  454.  
  455.  
  456.   i% = GetMenu(46, 11, 14)
  457.   CLS
  458.  
  459.   SELECT CASE i%
  460.     CASE 1: DoCommand &HE, CHR$(1)
  461.     CASE 2: DoCommand &HE, CHR$(0)
  462.     CASE 3: DoCommand &HE, CHR$(&HB1)
  463.     CASE 4: DoCommand &HE, CHR$(&HB0)
  464.   END SELECT
  465. END SUB
  466.  
  467. '
  468. '  MenuTuning      - Put the Tuning Menu up and get user input
  469. '
  470. SUB MenuTuning
  471.  
  472.   LOCATE 7, 65:  PRINT "┌─────────┐";
  473.   LOCATE 8, 65:  PRINT "│  10 Hz  │";
  474.   LOCATE 9, 65:  PRINT "│   1 Khz │";
  475.   LOCATE 10, 65: PRINT "│   2 Khz │";
  476.   LOCATE 11, 65: PRINT "│   3 Khz │";
  477.   LOCATE 12, 65: PRINT "│   4 Khz │";
  478.   LOCATE 13, 65: PRINT "│   5 Khz │";
  479.   LOCATE 14, 65: PRINT "│   6 Khz │";
  480.   LOCATE 15, 65: PRINT "│   7 Khz │";
  481.   LOCATE 16, 65: PRINT "│   8 Khz │";
  482.   LOCATE 17, 65: PRINT "│   9 Khz │";
  483.   LOCATE 18, 65: PRINT "│  10 Khz │";
  484.   LOCATE 19, 65: PRINT "└─────────┘"
  485.  
  486.  
  487.   i% = GetMenu(66, 8, 18)
  488.   CLS
  489.  
  490.   IF i% > 0 THEN
  491.     DoCommand &H10, CHR$(i% - 1)
  492.   END IF
  493. END SUB
  494.  
  495. '
  496. '  MenuVFO      - Put the VFO Menu up and get user input
  497. '
  498. SUB MenuVFO
  499.  
  500.   ShowPrompt
  501.   LOCATE 8, 45:  PRINT "┌────────────────┐"
  502.   LOCATE 9, 45:  PRINT "│  Select VFO    │"
  503.   LOCATE 10, 45: PRINT "│  Select VFO A  │"
  504.   LOCATE 11, 45: PRINT "│  Select VFO B  │"
  505.   LOCATE 12, 45: PRINT "│  VFO A = VFO B │"
  506.   LOCATE 13, 45: PRINT "│  Swap A and B  │"
  507.   LOCATE 14, 45: PRINT "│  Split on      │"
  508.   LOCATE 15, 45: PRINT "│  Split Off     │"
  509.   LOCATE 16, 45: PRINT "│  Set Offset    │"
  510.   LOCATE 17, 45: PRINT "└────────────────┘"
  511.  
  512.  
  513.   i% = GetMenu(46, 9, 16)
  514.   CLS
  515.  
  516.   SELECT CASE i%
  517.     CASE 1: DoCommand &H7, ""
  518.     CASE 2: DoCommand &H7, CHR$(0)
  519.     CASE 3: DoCommand &H7, CHR$(1)
  520.     CASE 4: DoCommand &H7, CHR$(&HA0)
  521.     CASE 5: DoCommand &H7, CHR$(&HB0)
  522.     CASE 6: DoCommand &HF, CHR$(1)
  523.     CASE 7: DoCommand &HF, CHR$(0)
  524.     CASE 8: DoCommand &HD, GetOff$
  525.   END SELECT
  526. END SUB
  527.  
  528. DEFDBL F
  529. SUB ParseEcho (Echo AS STRING)
  530.   VIEW PRINT 16 TO 19
  531.   IF SHOWCOM THEN
  532.       LOCATE 17, 7: PRINT STRtoHEX$(Echo);
  533.   END IF
  534.  
  535. END SUB
  536.  
  537. '
  538. ' ParseReply      - Character has arrived from rig, stuff it away until
  539. '                   have an entire packet and process it.
  540. '
  541. SUB ParseReply
  542.   STATIC Hold$
  543.  
  544.   '
  545.   ' Accumulate the Reply, if its not end of packet get out early
  546.   '
  547.   Hold$ = Hold$ + INPUT$(LOC(PORTNO), PORTNO)
  548.   IF INSTR(Hold$, CHR$(&HFD)) = 0 THEN
  549.     EXIT SUB
  550.   END IF
  551.  
  552.   SELECT CASE MID$(Hold$, 3, 1)         ' Who was the packet from?
  553.     CASE CHR$(RA): ParseEcho (Hold$)      '   - Controller
  554.    
  555.     CASE CHR$(TA): ParseRig (Hold$)       '   - Rig
  556.    
  557.     CASE CHR$(0):  ParseTranceive (Hold$) '   - Transceive Function
  558.   END SELECT
  559.  
  560.  
  561.   ' Get ready for next reply
  562.   Hold$ = ""
  563. END SUB
  564.  
  565. '
  566. '  ParseRig     - Process packets that came from the rig
  567. '
  568. SUB ParseRig (rig AS STRING)
  569.   '
  570.   ' Echo replys to the screen if we were told to
  571.   '
  572.   IF SHOWCOM THEN
  573.       LOCATE 18, 7: PRINT STRtoHEX$(rig);
  574.   END IF
  575.  
  576.  
  577.   SELECT CASE MID$(rig, 5, 1)
  578.        
  579.     CASE CHR$(&HFF): LOCATE 25, 1: PRINT "[BLANK]  ";
  580.     CASE CHR$(&HFB): LOCATE 25, 1: PRINT "[OK]     ";
  581.     CASE CHR$(&HFA): LOCATE 25, 1: PRINT "[ERROR]  ";
  582.    
  583.     CASE CHR$(&H2):  ShowLimit (MID$(rig, 6))
  584.     CASE CHR$(&H3):  ShowFreq (MID$(rig, 6))
  585.     CASE CHR$(&H4):  ShowMode (MID$(rig, 6))
  586.     CASE CHR$(&HC):  ShowOffset (MID$(rig, 6))
  587.  
  588.     CASE ELSE:       LOCATE 25, 1: PRINT "[Unknown]";
  589.  
  590.   END SELECT
  591. END SUB
  592.  
  593. '
  594. '  ParseTranceive - Process packets that showed up as "Tranceive" packets
  595. '
  596. SUB ParseTranceive (Tranceive AS STRING)
  597.   '
  598.   ' Echo replys to the screen if we were told to
  599.   '
  600.   VIEW PRINT 17 TO 19
  601.   IF SHOWCOM THEN
  602.       LOCATE 19, 7: PRINT STRtoHEX$(Tranceive);
  603.   END IF
  604.  
  605.   LOCATE 25, 1: PRINT "[Track]  ";
  606.  
  607.   SELECT CASE MID$(Tranceive, 5, 1)
  608.       
  609.     CASE CHR$(&H0):  ShowFreq (MID$(Tranceive, 6))
  610.     CASE CHR$(&H1):  ShowMode (MID$(Tranceive, 6))
  611.  
  612.     CASE ELSE:       LOCATE 25, 1: PRINT "[UnTrack]";
  613.   END SELECT
  614. END SUB
  615.  
  616. '
  617. '  Set up the BCD string array
  618. '
  619. SUB SetupBCD
  620.   FOR M = 0 TO 9
  621.     FOR N = 0 TO 9
  622.       BCD$(10 * M + N) = CHR$(16 * M + N)
  623.     NEXT N
  624.   NEXT M
  625. END SUB
  626.  
  627. '
  628. '  Setup the channel to the serial port
  629. '
  630. SUB SetupCOM
  631.  OPEN PORT$ + ":" + CONF$ + ",CD0,CS0,DS0,OP0,RS" FOR RANDOM AS #1
  632.   ON COM(PORTNO) GOSUB Serial
  633.   COM(PORTNO) ON
  634. END SUB
  635.  
  636. '
  637. '  ShowFreq     -  Print the Frequency to the Display area
  638. '
  639. SUB ShowFreq (Args AS STRING)
  640.   VIEW PRINT 1 TO 5
  641.   LOCATE 4, 6
  642.   PRINT USING "#,###,###,###"; BCDtoINT(Args, FREQCNT)
  643. END SUB
  644.  
  645. '
  646. '  ShowLimit    - Print the upper and lower band limits in the display area
  647. '
  648. SUB ShowLimit (Args AS STRING)
  649.  
  650.  VIEW PRINT 1 TO 5
  651.   LOCATE 4, 52
  652.   PRINT USING "#,###,###,###"; BCDtoINT(Args, FREQCNT)
  653.  
  654.   A$ = MID$(Args, FREQCNT + 2)
  655.   LOCATE 4, 67
  656.   PRINT USING "#,###,###,###"; BCDtoINT(A$, FREQCNT)
  657.  
  658. END SUB
  659.  
  660. '
  661. '  ShowMainPrompts      - Print the Display and Menu Key Info
  662. '
  663. SUB ShowMainPrompts
  664.  
  665.   VIEW PRINT 1 TO 25
  666.   CLS
  667.  
  668.   '
  669.   ' Paint the Output Fields
  670.   '
  671.   LOCATE 1, 1
  672.   PRINT "                                                 ┌────────── Limits ───────────┐"
  673.   PRINT "Chan   Frequency       Mode    IF Width   Offset       Lower          Upper     "
  674.   PRINT "┌──┐┌──────────────┬─────────┐┌────────┐┌───────┐┌──────────────┬──────────────┐"
  675.   PRINT "│  ││              │         ││        ││       ││              │              │"
  676.   PRINT "└──┘└──────────────┴─────────┘└────────┘└───────┘└──────────────┴──────────────┘"
  677.  
  678.   '
  679.   ' Paint the prompts
  680.   '
  681.   LOCATE 21, 1
  682.   PRINT "╔═══════╦═══════╦═══════╦═══════╦═══════╦═══════╦═══════╦═══════╦═══════╦══════╗"
  683.   PRINT "║  F1   ║  F2   ║  F3   ║  F4   ║  F5   ║  F6   ║  F7   ║  F8   ║       ║ F10  ║"
  684.   PRINT "║ Read  ║  VFO  ║  Mem  ║ Mode  ║ Freq  ║ Offset║ Scan  ║ Misc  ║       ║ EXIT ║"
  685.   PRINT "╚═══════╩═══════╩═══════╩═══════╩═══════╩═══════╩═══════╩═══════╩═══════╩══════╝"
  686.   VIEW PRINT 6 TO 20
  687.  
  688.   '
  689.   '  Setup function key handlers for each options
  690.   '
  691.   ON KEY(1) GOSUB F1
  692.   ON KEY(2) GOSUB F2
  693.   ON KEY(3) GOSUB F3
  694.   ON KEY(4) GOSUB F4
  695.   ON KEY(5) GOSUB F5
  696.   ON KEY(6) GOSUB F6
  697.   ON KEY(7) GOSUB F7
  698.   ON KEY(8) GOSUB F8
  699.   ON KEY(10) GOSUB F0
  700.  
  701.   '
  702.   '  Turn the key handlers on
  703.   '
  704.   FOR i% = 1 TO 8
  705.     KEY(i%) ON
  706.   NEXT i%
  707.   KEY(10) ON
  708. END SUB
  709.  
  710. '
  711. '  ShowMode     - Print the Mode and Width in the display area
  712. '
  713. SUB ShowMode (Args AS STRING)
  714.  
  715.   VIEW PRINT 1 TO 5
  716.   LOCATE 4, 21
  717.   SELECT CASE MID$(Args, 1, 1)
  718.     CASE CHR$(0): PRINT "   LSB   ";
  719.     CASE CHR$(1): PRINT "   USB   ";
  720.     CASE CHR$(2): PRINT "   AM    ";
  721.     CASE CHR$(3): PRINT "   CW    ";
  722.     CASE CHR$(4): PRINT "  RTTY   ";
  723.     CASE CHR$(5): PRINT "   FM    ";
  724.     CASE CHR$(6): PRINT " Wide-FM ";
  725.     CASE ELSE: PRINT USING "   ##   "; HEX$(ASC(MID$(Args, 1, 1)))
  726.   END SELECT
  727.  
  728.   LOCATE 4, 32
  729.   SELECT CASE MID$(Args, 2, 1)
  730.     CASE CHR$(0): PRINT "        ";
  731.     CASE CHR$(1): PRINT "  Wide  ";
  732.     CASE CHR$(2): PRINT " Narrow ";
  733.     CASE ELSE: PRINT USING "   ##   "; HEX$(ASC(MID$(Args, 2, 1)))
  734.   END SELECT
  735.   
  736. END SUB
  737.  
  738. '
  739. '  ShowOffset   - Print the frequency offset in the display area
  740. '
  741. SUB ShowOffset (Args AS STRING)
  742.  VIEW PRINT 1 TO 5
  743.   i& = BCDtoINT(Args, 3)
  744.   f = CDBL(i&) / 100000
  745.   LOCATE 4, 42
  746.   PRINT USING "#.#####"; f
  747. END SUB
  748.  
  749. DEFSNG F-Z
  750. '
  751. '  ShowPrompt   - Clear the center of the screen and paint the
  752. '                 menu prompt on the left side
  753. '
  754. SUB ShowPrompt
  755.   VIEW PRINT 6 TO 20
  756.   CLS
  757.   LOCATE 11, 5: PRINT "Use arrow keys to move the "
  758.   LOCATE 12, 5: PRINT "selection. Press the ENTER "
  759.   LOCATE 13, 5: PRINT "key to select or press the "
  760.   LOCATE 14, 5: PRINT "ESC key to abort.          "
  761. END SUB
  762.  
  763. DEFINT G-Z
  764. DEFDBL F
  765. '
  766. ' STRtoHEX$ - Translate all the characters in a string to hex and
  767. '             return the resulting string.
  768. '
  769. FUNCTION STRtoHEX$ (Str AS STRING)
  770. Scn$ = ""
  771. FOR i = 1 TO LEN(Str)
  772.      C$ = HEX$(ASC(MID$(Str, i, 1)))
  773.      Scn$ = Scn$ + C$ + " "
  774.   NEXT i
  775. STRtoHEX$ = Scn$
  776. END FUNCTION
  777.  
  778.